/* ----------------------Excel导入封装类,ImportHelper.js----相关说明------- 
|	功能：对excel导入的前台部分进行封装，提供多Excel文件的异步上传导入，以及导入进度显示
|   作者：mayh
|   时间：2011年6月
|	使用方法：在页面引入jquery.js、ImportHelper.js、importHelper.css、ajaxfileupload.js、jMap.js
|	注意：该导入不支持excel-2007及以上版本
|	参数说明：
|	-------postUrl：对上传excel进行业务处理的地址
|	-------syncUrl：获得同步数据的地址
|	-------templateUrl：模板文件的完整URL
|	-------timer:同步数据的间隔时间(前台每隔多长时间到后台请求一次时时数据)，根据不同的业务需求进行设置【默认值：500ms】
|	-------renderTo：上传窗口的位置【默认值：body】
--------------------------------------------------------------*/

var ImportHelper = function(config){
	//属性复制
	$.extend(this,ImportHelper.defaults,config);
	this.renderTo = typeof this.renderTo == 'string'?$("#"+this.renderTo):this.renderTo;
	this.init();
}
//添加默认属性
ImportHelper.defaults = {
	renderTo : $(document.body),
	timer:500
}
ImportHelper.prototype = {
	init : function(){
		var entity = this;
		var div = [];
		var id = this.guid();
		div.push('<div class="import" id="'+id+'">');
		div.push('<div class="title"><div class="add" title="添加一行"></div>注意：请按照指定的模板进行导入(可选多文件)<a class="template" href="'+this.templateUrl+'">查看模板</a></div>');
		div.push('<div class="content">');
		div.push('<div class="fileDiv"><input type="file" id="'+entity.guid()+'" name="upload" class="uploadFile"/></div>');
		div.push('</div>');
		div.push('<div class="button"><span>导入</span></div>');
		div.push('</div>');
		this.renderTo.append(div.join(''));
		$("#"+id+" .button").click(function(){	
			entity.submitFile();
		});
		$("#"+id+" .add").click(function(){
			var fileDiv = '<div class="fileDiv"><input type="file" id="'+entity.guid()+'" name="upload" class="uploadFile"/><div class="delete" title="删除该行"></div></div>';
			$(fileDiv).appendTo($("#"+id+" .content"));
			$(".delete").click(function(){
			$(this).closest(".fileDiv").remove();
			});
		});
	},
	//提交文件
	submitFile : function(){
		var entity = this;
		//创建一个map，来存放每个file对应的timer信息
		entity.fileMap = new Map();
		$(":file").each(function(){
			var file = $(this);
			if(file.val()!=""){
				entity.ajaxUpload(file.attr("id"));
			}
		});
	},
	//为每一个文件创建一个线程
	ajaxUpload:function(fileId){
		var entity = this;
		$.ajaxFileUpload(
        {
            url:entity.postUrl+"?fileId="+fileId,//用于文件上传的服务器端请求地址
            secureuri:false,//一般设置为false
            fileElementId:fileId,//文件上传空间的id属性  <input type="file" id="file" name="file" />
            dataType: 'json',//返回值类型 一般设置为json
            success: function (iv, status)  //服务器成功响应处理函数
            {
        	//获得上传的当前文件对应的定时器
        	var timer = entity.fileMap.get(fileId);
        		if(timer){
        		window.clearInterval(timer);
        		}
        		//更新上传进度条
        		entity.setProgress(fileId,iv,true);
        		//创建详细信息
        		entity.importDetails(fileId,iv);
        		//创建还原按钮
        		entity.restore();
            },
            error: function (data, status, e)//服务器响应失败处理函数
            {
            }
        }
   	 )
   	 //创建一个定时器
   	 var timer = window.setInterval(function(){
   	 	entity.syncProgress(fileId);
   	 },entity.timer);
   	 //将文件和定时器对象添加到map中
   	 entity.fileMap.put(fileId,timer);
   	 //将文本框移除，替换为上传进度条
   	 $(entity.initProgress(fileId)).insertAfter($("#"+fileId));
   	 $(":file").hide();
   	 //移除该文本框后面的删除按钮
   	$(".delete").hide();
   	 //删除提交按钮
   	 $(".button").hide();
   	 //隐藏添加按钮
   	 $(".add").hide();
	},
	//获取同步数据
	syncProgress:function(fileId){
	var entity = this;
		var req = $.ajax({
		url:entity.syncUrl,
		type:'post',
		dataType:'json',
		timeout:3000,
		data:"fileId="+fileId,
		success:function(data){
			entity.setProgress(fileId,data,false);
		}
		});
	},
	//初始化进度条
	initProgress:function(id){
		var div = [];
			div.push('<div id="file-'+id+'" class="uploadFileName"><span></span></div>');
			div.push('<div class="progress" id="p-'+id+'">');
			div.push('<div class="progressBac"></div>');
			div.push('<div class="progressText">文件正在上传，请稍后……</div>');
			div.push('</div>');
		return div.join('');
	},
	//设置进度条的属性
	setProgress:function(fileId,iv,complate){
		if(fileId){
			//设置上传文件名
			$("#file-"+fileId+" span").text(iv.fileName);
			//获得进度条的总长度
			var progressWidth = $("#p-"+fileId).width();
			if(!complate){
			//设置进度条进度
			$("#p-"+fileId+" .progressBac").width(progressWidth*(iv.successCount)/(iv.rowCount));
			//设置相应的文本
			$("#p-"+fileId+" .progressText").text("正在导入:"+iv.successCount+"/"+iv.rowCount+"("+Math.ceil(iv.successCount/iv.rowCount*100)+"%)");
			}else {
			//设置进度条进度
			$("#p-"+fileId+" .progressBac").width(progressWidth);
			//设置相应的文本
			$("#p-"+fileId+" .progressText").text("导入完成:"+iv.successCount+"/"+iv.rowCount+"("+(iv.successCount/iv.rowCount*100+"").substr(0,4)+"%)");
			if(iv.successCount<iv.rowCount){
				$("#p-"+fileId+" .progressBac").addClass("progressErrorBac").removeClass("progressBac");
				$("#p-"+fileId).css("border-color","#da5454");
			}
		  }
		}
    },
    //导入详细信息
    importDetails:function(fileId,iv){
    	var entity = this;
    	var div = [];
    		div.push('<div class="importDone">');
    		//创建失败详细信息
    		div.push('<div class="errors">');
    		div.push('<table class="errorTable">');
    		div.push('<tr><td>统计信息</td><td colspan="3">Sheet：<span class="sheetCount">'+iv.sheetCount+'</span>，总记录：<span class="rowCount">'+iv.rowCount+'</span>，成功：<span class="successCount">'+iv.successCount+'</span>，失败：<span class="errorCount">'+iv.errorCount+'</span></td></tr>');
    		if(iv.errorList.length>0){
    		div.push('<tr><td>文件名</td>');
    		div.push('<td>sheet名</td>');
    		div.push('<td>位置[行,列]</td>');
    		div.push('<td>原因</td>');
    		div.push('</tr>');
    			var list = iv.errorList;
    			for(var i=0;i<list.length;i++){
    				var jvo = list[i];
	    			div.push('<tr>');
		    		div.push('<td>'+jvo.fileName+'</td>');
		    		div.push('<td>'+jvo.sheetName+'</td>');
		    		div.push('<td>['+jvo.row+','+jvo.column+']</td>');
		    		div.push('<td>'+jvo.errorStr+'</td>')
		    		div.push('</tr>');
    			}
    			}
    		div.push('</table>');
    		div.push('</div>');
    		div.push('</div>');
    		$("#"+fileId).parent().after(div.join(''));
    		
   			//添加一个点击字符串
       		$("#p-"+fileId).after('<span class="detail">详细信息</span>');
       		//添加点击事件
       		$("#p-"+fileId).siblings(".detail").click(function(){
       			$("#p-"+fileId).parent().next(".importDone").toggle();
       		});
    },
    //恢复原来的上传状态
    restore:function(){
    	var entity = this;
        		if(!($(".goback").length)){
	        	$('<a class="goback" href="#">继续导入</a>').appendTo(".title").click(function(){
        			//删除所有的进度条
        			$(".progress").remove();
        			//删除所有的详细信息
        			$(".detail").remove();
        			$(".importDone").remove();
        			$(".uploadFileName").remove();
        			//---恢复添加
        			var keys = entity.fileMap.keys();
        			for(var j=0;j<keys.length;j++){
        				$("#"+keys[j]).show();
        				$("#"+keys[j]).next(".delete").show();
        			}
				 	$(".button").show();
				 	$(".add").show();
        			$(this).remove();
        		});
        }
    },
   //产生一个Guid
	guid : function(){
		var guid = 'v-0000-0000-0000-0000-0000'
		return guid.replace(/0/g, function(){return Math.random().toString(16).substr(2,1)});
	}
}
